﻿using System;
using AModel.Generador.Dominio.Entidades;
using AModel.Generador.Dominio;
using AModel.Generador.Dominio.Base;
using AModel.Generador.Dominio.Relaciones;
using AModel.Generador.Dominio.Paquete;

namespace AModel.Generador.Servicios
{
    public class ServicioClases 
    {

        Contexto contexto;


        public ServicioClases( Contexto ctx = null ) {
            if (ctx == null) {
                ctx = new Contexto();
            }
            contexto = ctx;
        }
        
        
        public Clase CrearNuevaClase(String Nombre)
        {
            Clase nuevaClase = null;

            if (contexto.Elementos.Contains(Nombre))
            {
                nuevaClase = (Clase) contexto.Elementos[Nombre];
            }
            else {
                nuevaClase = new Clase(Nombre);                
                contexto.Elementos.Add( nuevaClase);
            }
            return nuevaClase;
        }

        public Clase Obtener(string NombreClase1)
        {
            Clase resultado = null;
            if (contexto.Elementos.Contains(NombreClase1)) {
                resultado = (Clase)contexto.Elementos[NombreClase1];
            }

            return resultado;
        }

        public void AgregarAtributo(String nombreClase, ClaseSistema atributo)
        {
            Clase clase = Obtener(nombreClase);
            clase.Atributos.Add(atributo);
        }

        public void Renombrar(string NombreClase1, string NombreClase2)
        {
            Clase clase = Obtener(NombreClase1);
            contexto.Elementos.Remove(NombreClase1);
            clase.Nombre = NombreClase2;
            contexto.Elementos.Add(clase);
        }

        public Clase Clonar(string NombreClase1, string NombreClase2)
        {
            Clase clase = Obtener(NombreClase1);
            Clase claseClonada = (Clase) clase.Clone();
            claseClonada.Nombre = NombreClase2;
            contexto.Elementos.Add(claseClonada);
            return claseClonada;
        }

        

        public Interfaz CrearInterfaz(string Nombre)
        {
            Interfaz nuevaInterfaz = null;

            if (contexto.Elementos.Contains(Nombre))
            {
                nuevaInterfaz = (Interfaz)contexto.Elementos[Nombre];
            }
            else
            {
                nuevaInterfaz = new Interfaz(Nombre);                
                contexto.Elementos.Add(nuevaInterfaz);
            }
            return nuevaInterfaz;
        }

        public void registrarRelacíon(Relacion relacion)
        {
            relacion.ClaseA.Relaciones.Add( relacion);
            relacion.ClaseB.Relaciones.Add( relacion);            
        }


        public void AgregarAPaquete(Paquete paquete, Paquete contenedor)
        {
            contenedor.SubPaquetes.Add(paquete);
        }

        public Paquete registrarPaquete(string nombre)
        {
            Paquete nuevoPaquete = null;

            if (contexto.Elementos.Contains(nombre))
            {
                nuevoPaquete = (Paquete) contexto.Elementos[nombre];
            }
            else
            {
                nuevoPaquete = new Paquete(nombre);
                contexto.Elementos.Add( nuevoPaquete);
            }
            return nuevoPaquete;
        }

        public void AgregarAPaquete(Paquete paquete, Clase claseA)
        {
            paquete.Elementos.Add(claseA);
        }
    }
}
